From 17af979b24fc2d60e6a90e3bcc09c6db63f43774 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 19 Jun 2020 15:09:57 -0400 Subject: [PATCH] testlistdnd: Use editable labels Use editable labels instead of entries, and write changes back to the model. --- tests/testlistdnd.c | 73 +++++++++++++++++++++++++++++++-------------- 1 file changed, 51 insertions(+), 22 deletions(-) diff --git a/tests/testlistdnd.c b/tests/testlistdnd.c index d988cd6e1a..afabfba4c6 100644 --- a/tests/testlistdnd.c +++ b/tests/testlistdnd.c @@ -148,18 +148,6 @@ test_object_get_allow_children (TestObject *obj) /* * * */ -static GdkContentProvider * -prepare_drag (GtkDragSource *source, - double x, - double y) -{ - GtkWidget *label; - - label = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (source)); - return gdk_content_provider_new_typed (G_TYPE_STRING, - gtk_label_get_label (GTK_LABEL (label))); -} - static GListModel * create_model (guint base, guint n, @@ -216,11 +204,23 @@ setup_item (GtkSignalListItemFactory *factory, { GtkWidget *entry; - entry = gtk_entry_new (); + entry = gtk_editable_label_new (""); gtk_editable_set_width_chars (GTK_EDITABLE (entry), 3); gtk_list_item_set_child (item, entry); } +static void +text_changed (GObject *object, + GParamSpec *pspec, + gpointer data) +{ + const char *text; + + text = gtk_editable_get_text (GTK_EDITABLE (object)); +g_print ("text changed to '%s'\n", text); + g_object_set (data, "string", text, NULL); +} + static void bind_item (GtkSignalListItemFactory *factory, GtkListItem *item) @@ -230,8 +230,20 @@ bind_item (GtkSignalListItemFactory *factory, obj = gtk_list_item_get_item (item); entry = gtk_list_item_get_child (item); - gtk_editable_set_text (GTK_EDITABLE (entry), test_object_get_string (obj)); + g_signal_connect (entry, "notify::text", G_CALLBACK (text_changed), obj); +} + +static void +unbind_item (GtkSignalListItemFactory *factory, + GtkListItem *item) +{ + TestObject *obj; + GtkWidget *entry; + + obj = gtk_list_item_get_item (item); + entry = gtk_list_item_get_child (item); + g_signal_handlers_disconnect_by_func (entry, text_changed, obj); } static void @@ -241,7 +253,7 @@ setup_tree_item (GtkSignalListItemFactory *factory, GtkWidget *expander; GtkWidget *entry; - entry = gtk_entry_new (); + entry = gtk_editable_label_new (""); gtk_editable_set_width_chars (GTK_EDITABLE (entry), 3); expander = gtk_tree_expander_new (); gtk_tree_expander_set_child (GTK_TREE_EXPANDER (expander), entry); @@ -252,9 +264,9 @@ static void bind_tree_item (GtkSignalListItemFactory *factory, GtkListItem *item) { - TestObject *obj; GtkTreeListRow *row; GtkTreeExpander *expander; + TestObject *obj; GtkWidget *entry; row = gtk_list_item_get_item (item); @@ -263,6 +275,24 @@ bind_tree_item (GtkSignalListItemFactory *factory, obj = gtk_tree_list_row_get_item (row); entry = gtk_tree_expander_get_child (expander); gtk_editable_set_text (GTK_EDITABLE (entry), test_object_get_string (obj)); + + g_signal_connect (entry, "notify::text", G_CALLBACK (text_changed), obj); +} + +static void +unbind_tree_item (GtkSignalListItemFactory *factory, + GtkListItem *item) +{ + GtkTreeListRow *row; + GtkTreeExpander *expander; + TestObject *obj; + GtkWidget *entry; + + row = gtk_list_item_get_item (item); + expander = GTK_TREE_EXPANDER (gtk_list_item_get_child (item)); + obj = gtk_tree_list_row_get_item (row); + entry = gtk_tree_expander_get_child (expander); + g_signal_handlers_disconnect_by_func (entry, text_changed, obj); } int @@ -271,7 +301,6 @@ main (int argc, char *argv[]) GtkWidget *window; GtkWidget *box; GtkWidget *label; - GtkDragSource *dragsource; GtkWidget *box2; GtkWidget *stack; GtkWidget *switcher; @@ -300,13 +329,9 @@ main (int argc, char *argv[]) gtk_box_set_homogeneous (GTK_BOX (box), TRUE); gtk_box_append (GTK_BOX (box2), box); - label = gtk_label_new ("Drag me"); + label = gtk_editable_label_new ("Drag me"); gtk_box_append (GTK_BOX (box), label); - dragsource = gtk_drag_source_new (); - g_signal_connect (dragsource, "prepare", G_CALLBACK (prepare_drag), NULL); - gtk_widget_add_controller (label, GTK_EVENT_CONTROLLER (dragsource)); - stack = gtk_stack_new (); gtk_widget_set_vexpand (stack, TRUE); gtk_stack_switcher_set_stack (GTK_STACK_SWITCHER (switcher), GTK_STACK (stack)); @@ -330,6 +355,7 @@ main (int argc, char *argv[]) factory = gtk_signal_list_item_factory_new (); g_signal_connect (factory, "setup", G_CALLBACK (setup_item), NULL); g_signal_connect (factory, "bind", G_CALLBACK (bind_item), NULL); + g_signal_connect (factory, "unbind", G_CALLBACK (unbind_item), NULL); gtk_grid_view_set_factory (GTK_GRID_VIEW (grid), factory); g_object_unref (factory); @@ -349,6 +375,7 @@ main (int argc, char *argv[]) factory = gtk_signal_list_item_factory_new (); g_signal_connect (factory, "setup", G_CALLBACK (setup_item), NULL); g_signal_connect (factory, "bind", G_CALLBACK (bind_item), NULL); + g_signal_connect (factory, "unbind", G_CALLBACK (unbind_item), NULL); gtk_list_view_set_factory (GTK_LIST_VIEW (list), factory); g_object_unref (factory); @@ -372,6 +399,7 @@ main (int argc, char *argv[]) factory = gtk_signal_list_item_factory_new (); g_signal_connect (factory, "setup", G_CALLBACK (setup_item), NULL); g_signal_connect (factory, "bind", G_CALLBACK (bind_item), NULL); + g_signal_connect (factory, "unbind", G_CALLBACK (unbind_item), NULL); title = g_strdup_printf ("Column %u", i); column = gtk_column_view_column_new_with_factory (title, factory); @@ -397,6 +425,7 @@ main (int argc, char *argv[]) factory = gtk_signal_list_item_factory_new (); g_signal_connect (factory, "setup", G_CALLBACK (setup_tree_item), NULL); g_signal_connect (factory, "bind", G_CALLBACK (bind_tree_item), NULL); + g_signal_connect (factory, "unbind", G_CALLBACK (unbind_tree_item), NULL); gtk_list_view_set_factory (GTK_LIST_VIEW (list), factory); g_object_unref (factory); -- 2.30.2